<?xml version="1.0" encoding="UTF-8"?>
<doc>
<title>with </title>

<para>
<ptitle>with 语句</ptitle>
　<kw>with</kw> 语句是在需要省略 <tt>.</tt>(点) 运算符左侧的操作对象时指定被省略的操作对象的语句。<r/>
<r/>
　本语句的语法如下。<r/>
<bq>
with(expression)<r/>
	语句或代码段<r/>
</bq>
<r/>
　指定的「语句或代码段」中，如果存在左侧被省略的 <tt>.</tt>(点) 运算符，则将以 with 语句 expresssion 中指定的对象作为该<tt>.</tt>(点) 运算符的左侧对象。<r/>
<r/>
<example>
	with(obj) .member = 1; // 和 obj.member = 1; 相同<r/>
<r/>
	with(obj)<r/>
	{<r/>
		.member1 = 1; // 将 1 赋值给 obj.member1 <r/>
		.member2 = 2; // 将 1 赋值给 obj.member2 <r/>
		.member3++; // 让 obj.member3 自增 1<r/>
		.method(); // 调用 obj.method <r/>
	}<r/>
</example>
<r/>
　本语句在需要大量设定对象属性，或者连续调用对象的方法的时候，可以大幅减少需要键入的代码的数量。<r/>
<r/>
　例如：<r/>
<r/>
<bq>
	var object = new Foo();<r/>
	object.setPos(0, 0);<r/>
	object.setSize(100, 100);<r/>
	object.name = "未命名";<r/>
	object.color = 0xffffffff;<r/>
</bq>
<r/>
　这样的脚本可以用以下的方式来编写。<r/>
<r/>
<bq>
	var object = new Foo();<r/>
	with(object)<r/>
	{<r/>
		.setPos(0, 0);<r/>
		.setSize(100, 100);<r/>
		.name = "未命名";<r/>
		.color = 0xffffffff;<r/>
	}<r/>
</bq>
<r/>
</para>

<para>
<ptitle>with 语句与对象</ptitle>
　with 调用语句所指定的 expression 将只在最初执行 with 的时候被执行求值，此后都只是对其结果进行饮用。<r/>
<r/>
　例如说<r/>
<r/>
<bq>
this.dic = %[];<r/>
with(this.dic)<r/>
{<r/>
	.member = 1; // 将 1 赋值给 this.dic.member<r/>
	this.dic = 0; // 将 dic 修改成别的东西<r/>
	.member = 2; // 将 2 赋值给this.dic.member<r/>
}<r/>
</bq>
<r/>
　虽然this.dic在过程中变化了，但是第二次对 .member 的赋值操作依然被成功进行。这是因为 with 在最初执行的时候就对 this.dic 这个表达式进行了求值，之后只是使用求值结果所得到的对象，而并不是每一次都对 this.dic 这个表达式重新求值。<r/>
<r/>
　由于求值操作只在最初的一次被执行，之后的操作都只是对对象进行引用，所以不必为了得到引用对象而经常执行相关代码，在有些情况下可以得到比较大的性能优化。<r/>
<r/>
　上面的例子可以理解为生成了以下代码。<r/>
<r/>
<bq>
this.dic = %[];<r/>
{<r/>
	var 未命名的特殊本地变量 = this.dic;<r/>
	未命名的特殊本地变量.member = 1;<r/>
	this.dic = 0;<r/>
	未命名的特殊本地变量.member = 2;<r/>
}<r/>
</bq>
<r/>
　with 语句将会把对 expression 的表达式求值结果代入一个未命名的特殊本地变量，这个变量只有左侧被省略的 . (点) 运算符才能够访问。以后，所有左侧被省略的 . (点) 运算符都会被看作引用这个“未命名的特殊本地变量”。<r/>
　对 expression 求值的结果所保持的作用域，也可以看作和上文“未命名的特殊本地变量”的本地变量作用域相同。 ( 这也是 with 语句能够影响的作用域 )。<r/>
</para>


<para>
<ptitle>with 语句外的 . 运算符</ptitle>
　with 语句之外出现左侧被省略的 <tt>.</tt> (点) 运算符，则将被当作左侧引用了全局( global )对象。<r/>
　例如，在 with 语句外编写<r/>
<r/>
<tt>.foo = 1;</tt><r/>
<r/>
　这样的语句，则该语句的效果和<r/>
<r/>
<tt>global.foo = 1;</tt><r/>
<r/>
　相同。<r/>
</para>

</doc>